# 关键字不定长参数: 接收任意多个关键字参数的形参类型
# 格式: **kwargs


# 1. 关键字不长参数,可以接收任意多个关键字参数赋值
def func1(**kwargs):
    print(kwargs)


# 在实参部分,使用关键字不定长参数进行赋值,会将其以字典的形式打包写入kwargs中,形参名为键, 数据内容为值.
func1(a=1, b=2, chuanzhi='youxiu')  # {'a': 1, 'b': 2, 'chuanzhi': 'youxiu'}

# 2. kwargs同样不能通过关键字 参数赋值
# {'kwargs': {'a': 1, 'b': 2}} 此时我们接收到的不是给kwargs赋值一个字典,而是将这个字典以key=kwargs进行赋值.
func1(kwargs={'a': 1, 'b': 2})

print('-----------------------------')
# 3. kwargs同样是一个参数名称, 可以进行修改
def func2(**itcast):
    print(itcast)


func2(a=1, b=2, chuanzhi='youxiu')  # {'a': 1, 'b': 2, 'chuanzhi': 'youxiu'}

print('-----------------------------')
# 4. kwargs可以和其他形参类型一起使用,但是只能放在末尾
def func3(a, b, *args, c=10, **kwargs):
    print(a, b)
    print(args)
    print(c)
    print(kwargs)


# 使用关键字参数赋值形式给函数赋值时,有对应的形参,优先给该形参赋值,如果该形参不存在,则给关键字不定长参数赋值.
func3(a=1, b=2, c=3, d=20, e=15)


# 注意
# 1.位置不定长参数和关键字不定长参数在一个函数中能出现一次
# 2.在开发中我们的参数类型数量以一种或两种居多.因为参数类型多,调用难度就大,沟通成本就高.
# 3.如果参数数量多,或者参数类型多,则最好进行文档注释(输入三对双引号点击回车即可)
# 4.使用 *args 和 **kwargs 可以接收一切参数

print('-----------------------------')
def func4(a, b, *args, c=10, **kwargs):
    """
    验证多种形参类型的排列顺序
    :param a: 第一个位置参数
    :param b: 第二个位置参数
    :param args: 位置不定长参数
    :param c: 缺省参数,默认值为10
    :param kwargs: 关键字不定长参数
    :return: 返回值无意义
    """
    print(a, b)
    print(args)
    print(c)
    print(kwargs)
    return '传智'


func4('a', 'b', 1,2,3)
